package app

import (
	"github.com/gin-gonic/gin"
	"github.com/olahol/melody"
	"gorm.io/gorm"

	"chat-app/internal/app/ws"
	"chat-app/pkg/database" // 导入数据库包
)

type Application struct {
	engine *gin.Engine
	wsMgr  *ws.Manager
	db     *gorm.DB // 添加数据库实例
}

func New() (*Application, error) {
	// 1. 初始化数据库连接
	db, err := database.InitDB() // 调用数据库初始化函数
	if err != nil {
		return nil, err
	}

	// 2. 自动迁移数据库（可选）
	if err := database.MigrateModels(db); err != nil {
		return nil, err
	}

	// 3. 创建Gin引擎
	engine := gin.Default()

	// 4. 修改 wsMgr 创建方式
	wsMgr := ws.NewManager(melody.New(), db) // 传入数据库实例

	// 5. 创建应用实例
	app := &Application{
		engine: engine,
		wsMgr:  wsMgr,
		db:     db, // 保存数据库实例
	}

	// 6. 注册路由 - 传递db实例
	SetupRoutes(engine, db, wsMgr)

	return app, nil
}

func (a *Application) Run(addr string) error {
	return a.engine.Run(addr)
}

// 添加关闭方法
func (a *Application) Close() error {
	sqlDB, err := a.db.DB()
	if err != nil {
		return err
	}
	return sqlDB.Close()
}
